feat: serializers module for RDB encode/decode#382
Conversation
- buffered_io.rs: BufferedWriter/BufferedReader with 256KB chunks and type-tagged values - encoder/mod.rs: rdb_save_graph_key encodes graph header, schema, matrices, attrs - decoder/mod.rs: rdb_load_graph decodes v19 format, reconstructs Graph via restore() - mod.rs: DECODE_STATE, VKEY_STATE, build_multi_key_payloads, encoding version constants
|
Caution Review failedPull request was closed or merged during review 📝 WalkthroughWalkthroughFour new Rust modules establish RDB serialization for graph data in v19 format. The changes introduce a buffered IO layer for type-tagged binary reads/writes, graph encoder/decoder implementations with multi-key support, and global state management for coordinating single and multi-key graph persistence operations. Changes
Sequence Diagram(s)sequenceDiagram
participant Client
participant Encoder as Graph Encoder
participant Writer as BufferedWriter
participant Redis as RDB Storage
Client->>Encoder: rdb_save_graph(graph)
Encoder->>Encoder: Build payload directory
Encoder->>Writer: new(rdb_io)
Encoder->>Writer: write_unsigned (header fields)
Encoder->>Writer: write_buffer (schema)
Encoder->>Writer: write_unsigned/write_buffer (payloads)
loop For each payload
Encoder->>Encoder: encode_payload(graph)
Encoder->>Writer: write_unsigned/write_buffer
end
Writer-->>Redis: flush on buffer overflow (256KB)
Encoder->>Writer: finish()
Writer-->>Redis: final chunk
Encoder-->>Client: Done
sequenceDiagram
participant Client
participant Decoder as Graph Decoder
participant Reader as BufferedReader
participant Redis as RDB Storage
participant State as DECODE_STATE
Client->>Decoder: rdb_load_graph(rdb)
Redis-->>Reader: load_string_buffer (chunk 0)
Reader->>Decoder: parse Header/Schema
alt Single Key (key_count == 1)
Decoder->>Reader: read payloads
Decoder->>Decoder: decode_payloads (to local stores)
Decoder->>Decoder: finalize (commit attrs, rebuild indexes)
Decoder-->>Client: return Graph
else Multi Key (key_count > 1)
Decoder->>State: init PendingGraph (key 0)
Decoder->>Reader: read/decode payloads
Decoder->>State: store in pending_graph
State-->>Decoder: keys_remaining--
Decoder->>Client: return None
Client->>Decoder: rdb_load_graph(key N)
Decoder->>State: load PendingGraph
Decoder->>Reader: read/decode payloads
Decoder->>State: merge into pending_graph
Note over State: When keys_remaining == 0
Decoder->>Decoder: finalize_pending_graph()
Decoder->>State: store finalized Graph
end
Estimated code review effort🎯 4 (Complex) | ⏱️ ~75 minutes Poem
🚥 Pre-merge checks | ✅ 2 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #382 +/- ##
==========================================
+ Coverage 82.32% 82.33% +0.01%
==========================================
Files 110 110
Lines 30078 30078
==========================================
+ Hits 24762 24766 +4
+ Misses 5316 5312 -4
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
Summary
buffered_io.rs: BufferedWriter/BufferedReader with 256KB chunks and type-tagged framing (C FalkorDB v2 compatible)encoder/mod.rs:rdb_save_graph_keyencodes graph header, schema, matrices, attrs as chunked payloadsdecoder/mod.rs:rdb_load_graphdecodes v19 format, reconstructsGraphviaGraph::restore()mod.rs:DECODE_STATE,VKEY_STATEglobals,build_multi_key_payloadshelper, encoding version constantsModule is not yet wired into
lib.rs— that happens in the final RDB persistence PR.Part of splitting #359 into smaller reviewable PRs.
Test plan
cargo checkpasses (module compiles but is not yet reachable)Summary by CodeRabbit
Release Notes